# -*- coding: utf-8 -*-
# @Time : 2025/6/26 14:04
# @FileName: 01.py
# @Target:
'''
使用 OpenAI 的方式调用 Ollama 服务
'''


import os
from openai import OpenAI
from openai.types.chat import ChatCompletion, ChatCompletionMessage


class OllamaClient:
    """
    Ollama 客户端，兼容 OpenAI API 规范
    支持聊天补全、流式响应、模型列表等功能
    """

    def __init__(self, base_url="http://117.50.223.179:11434", api_key="ollama", timeout=120):
        """
        初始化 Ollama 客户端

        :param base_url: Ollama 服务器地址
        :param api_key: API密钥（Ollama 不需要认证，但保留参数）
        :param timeout: 请求超时时间（秒）
        """
        self.client = OpenAI(
            base_url=f"{base_url}/v1",  # 使用兼容 OpenAI 的 /v1 端点
            api_key=api_key,
            timeout=timeout
        )

    def list_models(self):
        """获取可用的模型列表"""
        return self.client.models.list()

    def chat_completion(self, model, messages, **kwargs):
        """
        聊天补全（兼容 OpenAI 格式）

        :param model: 模型名称 (e.g. "llama3")
        :param messages: 消息列表 [{"role": "user", "content": "你好"}]
        :param kwargs: 其他参数 (stream, temperature, max_tokens, etc.)
        :return: ChatCompletion 对象
        """
        # 设置默认参数
        params = {
            "model": model,
            "messages": messages,
            "stream": kwargs.get("stream", False),
            "temperature": kwargs.get("temperature", 0.7),
            "max_tokens": kwargs.get("max_tokens", -1),
            "top_p": kwargs.get("top_p", 1.0),
            "frequency_penalty": kwargs.get("frequency_penalty", 0),
            "presence_penalty": kwargs.get("presence_penalty", 0),
        }

        # 添加可选参数
        optional_params = ["stop", "seed", "response_format"]
        for param in optional_params:
            if param in kwargs:
                params[param] = kwargs[param]

        # 发送请求
        response = self.client.chat.completions.create(**params)

        return response

    def stream_chat(self, model, messages, **kwargs):
        """流式聊天响应生成器"""
        kwargs["stream"] = True
        response = self.chat_completion(model, messages, **kwargs)

        for chunk in response:
            if chunk.choices:
                delta = chunk.choices[0].delta
                if delta.content:
                    yield delta.content



ollama = OllamaClient(
    base_url="http://117.50.223.179:11434",  # 替换为实际服务器地址
    timeout=180
)
# 示例4：列出可用模型
print("=" * 50)
print("可用模型列表:")
models = ollama.list_models()
for model in models.data:
    print(f"- {model.id}")
print("=" * 50)



class PROMPT:
    def __init__(self):
        ...

    def aaa (self):
        ...




# 使用示例
if __name__ == "__main__":
    # 初始化客户端（连接到远程服务器）
    content = """
[目标] 总结客户反馈中和座椅相关的内容，总结客户抱怨的原因
并最终使用**表格**的形式汇总
[待分析数据]
低中配座椅质感比较粗糙，只有高配18.99w前排座椅才有加热通风按摩。
虽然2025款与众06座舱内部的软质材料不少，但给人的手感整体偏硬。而且门板内侧等位置，2025款与众06都是采用塑料材质，质感并不是很好。另外，需要大家特别关注的是，2025款与众06的空间表现，我个人并不是很满意。而且2025款与众06虽然标配前排座椅位置记忆功能，可是仅有顶配与次顶配版本车型，才搭载座椅加热和按摩功能，而座椅通风功能，2025款与众06全系车型都没有搭载，这样的配置表现让我感到非常诧异。
2025款与众06虽然标配前排座椅位置记忆功能，可是仅有顶配与次顶配版本车型，才搭载座椅加热和按摩功能，而座椅通风功能，2025款与众06全系车型都没有搭载，这样的配置表现让我感到非常诧异。
虽然2025款与众06座舱内部的软质材料不少，但给人的手感整体偏硬。而且门板内侧等位置，2025款与众06都是采用塑料材质，质感并不是很好。2025款与众06虽然标配前排座椅位置记忆功能，可是仅有顶配与次顶配版本车型，才搭载座椅加热和按摩功能，而座椅通风功能，2025款与众06全系车型都没有搭载，这样的配置表现让我感到非常诧异。
而座椅通风功能，2025款与众06全系车型都没有搭载，这样的配置表现让我感到非常诧异。
而且2025款与众06虽然标配前排座椅位置记忆功能，可是仅有顶配与次顶配版本车型，才搭载座椅加热和按摩功能，而座椅通风功能，2025款与众06全系车型都没有搭载，这样的配置表现让我感到非常诧异。
虽然2025款与众06座舱内部的软质材料不少，但给人的手感整体偏硬。而且门板内侧等位置，2025款与众06都是采用塑料材质，质感并不是很好。
虽然2025款与众06座舱内部的软质材料不少，但给人的手感整体偏硬。
    """
    # 示例2：流式响应
    print("=" * 50)
    print("流式响应示例:")
    full_response = ""
    for chunk in ollama.stream_chat(
            model="qwq:32b-q8_0",
            messages=[
                {"role": "user", "content": content}
            ],
            temperature=0.7
    ):
        print(chunk, end="", flush=True)
        full_response += chunk

    print(f"\n\n完整回复: {full_response}\n")

"""
    # 示例1：基本聊天
    print("=" * 50)
    print("基本聊天示例:")
    response = ollama.chat_completion(
        model="qwq:32b-q8_0",
        messages=[
            {"role": "system", "content": "你是一个乐于助人的助手"},
            {"role": "user", "content": "用简单的语言解释量子计算"}
        ],
        max_tokens=500
    )

    print(f"模型: {response.model}")
    print(f"使用token数: {response.usage.total_tokens}")
    print(f"回复: {response.choices[0].message.content}\n")
"""



